/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modelo.personas.profesionales;

import geografia.GestorLocalidad;
import geografia.Localidad;
import hibernate.Busqueda;
import java.util.HashMap;
import java.util.List;
import modelo.CriterioBusqueda;
import modelo.GestorModelo;
import modelo.personas.GestorDocumento;
import modelo.personas.GestorDomicilio;
import modelo.personas.GestorTelefono;

/**
 *
 * @author Raul
 */
public class GestorProfesional extends GestorModelo<Profesional> {

    private HashMap<String, String> mapFiltros;

    public GestorProfesional() {
        mapFiltros = new HashMap();
        mapFiltros.put("Matricula", "matricula");
        mapFiltros.put("Nro Documento", "doc.numero");
        mapFiltros.put("Nombre", "nombre");
        mapFiltros.put("Apellido","apellido");
        mapFiltros.put("Especialidad", "esp.nombre");
        mapFiltros.put("Localidad", "loc.nombre");
        mapFiltros.put("Provincia", "prov.nombre");
    }
    
    @Override
    public void eliminar() {
        getModelo().setEstado(ELIMINADO);
        this.actualizar();
    }

    @Override
    public void crearModelo() {
        super.setModelo(new Profesional());
    }
    
    public void setDocumento(String tipo, int numero) {
        GestorDocumento gestorD= new GestorDocumento();
        gestorD.crearModelo();
        gestorD.getModelo().setTipo(tipo);
        gestorD.getModelo().setNumero(numero);
        getModelo().setDocumento(gestorD.getModelo());
    }
    
    public void setDomicilio(String calle, int altura, int piso, String departamento,
            String barrio, Localidad localidad){
        GestorDomicilio gD = new GestorDomicilio();
        gD.crearModelo();
        gD.getModelo().setCalle(calle);
        gD.getModelo().setAltura(altura);
        gD.getModelo().setBarrio(barrio);
        gD.getModelo().setPiso(piso);
        gD.getModelo().setDepartamento(departamento);
        gD.getModelo().setLocalidad(localidad);
        getModelo().getDomicilios().clear();
        getModelo().getDomicilios().add(gD.getModelo());
    }

    public void agregarTelefonos(List telefonos) {
        getModelo().getTelefonos().addAll(telefonos);
        getModelo().getTelefonos().retainAll(telefonos);
    }
    
    public void agregarEspecialidades(List especialidades) {
        getModelo().getEspecialidades().addAll(especialidades);
        getModelo().getEspecialidades().retainAll(especialidades);
    }

    public List listarProfesionales() {
        return super.listarClase(Profesional.class);
    }
    
    @Override
    public List buscar(CriterioBusqueda [] criterios) {
        Busqueda busq = new Busqueda(Profesional.class);
        busq.crearAlias("especialidades", "esp");
        busq.crearAlias("documento", "doc");
        busq.crearAlias("domicilios", "dom");
        busq.crearAlias("dom.localidad", "loc");
        busq.crearAlias("loc.provincia", "prov");
        busq.addEq("estado", ACTIVO);
        super.addRestricciones(busq, criterios, mapFiltros);
        return quitarRepeticionesDeLista(busq.ejecutar());
    }

    @Override
    public boolean noExiste() {
        Busqueda busq = new Busqueda(Profesional.class);
        busq.crearAlias("documento", "doc");
        busq.addEq("nombre", getModelo().getNombre());
        busq.addEq("apellido", getModelo().getApellido());
        busq.addEq("doc.numero", getModelo().getDocumento().getNumero());
        return busq.ejecutar().isEmpty();
    }

    @Override
    protected Profesional clonar(Profesional modelo) throws CloneNotSupportedException {
        return (Profesional) modelo.clone();
    }

    public List listarProvincias() {
        GestorLocalidad gL = new GestorLocalidad();
        return gL.listarProvincias();
    }
    
    public List buscarLocalidad(String provincia) {
        GestorLocalidad gL = new GestorLocalidad();
        return gL.buscar("Provincia", provincia);
    }
    
    public List buscarLocalidad(Integer codigoPostal) {
        GestorLocalidad gL = new GestorLocalidad();
        return gL.buscar("Codigo Postal", codigoPostal);
    }
    
    public Object nuevoTelefono(String codArea, int nroTelefono) {
        GestorTelefono gT= new GestorTelefono();
        return gT.crearModelo(codArea,nroTelefono);
    }

    public List listarEspecialidades() {
        GestorEspecialidad gE = new GestorEspecialidad();
        return gE.listarEspecialidades();
    }

}
